package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEstado;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEstadoCivil;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.componentes.CEPBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.CPFBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.DateBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.EMailBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.NumberBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.EstadosCivisListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.EstadosListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;

public class AAlteraDadosProfissional extends DockPanel
{
	private FlexTable flexTable;

	private Button atualizarBtn;

	private TextBox nomeTxt;
	private CPFBox cpfTxt;
	private NumberBox rgTxt;
	private NumberBox telefoneResidencialTxt;
	private NumberBox celularTxt;
	private EMailBox emailTxt;
	private DateBox dataNascimentoTxt;
	private EstadosCivisListBox estadoCivilListbox;
	private TextBox enderecoTxt;
	private NumberBox numeroTxt;
	private TextBox bairroTxt;
	private TextBox complementoTxt;
	private TextBox cidadeTxt;
	private EstadosListBox estadosListBox;
	private CEPBox cepTxt;

	private int idProfissional;

	public AAlteraDadosProfissional(final BeanProfissionalAssinante bProfissionalAssinante)
	{
		inicializarComponentes();

		idProfissional = bProfissionalAssinante.getId();

		flexTable.setCellSpacing(5);

		setarTamanhoCampos();
		setarAlinhamento();

		flexTable.setWidget(0, 0, new HTML("<b>ATUALIZE SEUS DADOS</b>"));
		flexTable.getFlexCellFormatter().setColSpan(0, 0, 2);

		flexTable.setWidget(1, 0, new HTML("<b>* Nome:</b> "));
		flexTable.setWidget(1, 1, nomeTxt);

		flexTable.setWidget(2, 0, new HTML("<b>* CPF:</b> "));
		flexTable.setWidget(2, 1, cpfTxt);

		flexTable.setWidget(3, 0, new HTML("RG:"));
		flexTable.setWidget(3, 1, rgTxt);

		flexTable.setWidget(4, 0, new HTML("Data de nascimento: "));
		flexTable.setWidget(4, 1, dataNascimentoTxt);

		flexTable.setWidget(5, 0, new HTML("Estado Civil: "));
		flexTable.setWidget(5, 1, estadoCivilListbox);

		flexTable.setWidget(6, 0, new HTML("Telefone Residencial: "));
		flexTable.setWidget(6, 1, telefoneResidencialTxt);

		flexTable.setWidget(7, 0, new HTML("Celular: "));
		flexTable.setWidget(7, 1, celularTxt);

		flexTable.setWidget(8, 0, new HTML("E-Mail: "));
		flexTable.setWidget(8, 1, emailTxt);

		flexTable.setWidget(9, 0, new HTML("Endereço: "));
		flexTable.setWidget(9, 1, enderecoTxt);

		flexTable.setWidget(10, 0, new HTML("CEP: "));
		flexTable.setWidget(10, 1, cepTxt);

		flexTable.setWidget(11, 0, new HTML("Número: "));
		flexTable.setWidget(11, 1, numeroTxt);

		flexTable.setWidget(12, 0, new HTML("Bairro: "));
		flexTable.setWidget(12, 1, bairroTxt);

		flexTable.setWidget(13, 0, new HTML("Complemento: "));
		flexTable.setWidget(13, 1, complementoTxt);

		flexTable.setWidget(14, 0, new HTML("Cidade: "));
		flexTable.setWidget(14, 1, cidadeTxt);

		flexTable.setWidget(15, 0, new HTML("Escolha o Estado: "));
		flexTable.setWidget(15, 1, estadosListBox);

		flexTable.setWidget(16, 0, atualizarBtn);
		flexTable.getFlexCellFormatter().setColSpan(16, 0, 2);
		flexTable.getFlexCellFormatter().setAlignment(16, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);

		setarMaxLength();

		AsyncCallback<BeanProfissionalAssinante> cbDadosProfissional = new AsyncCallback<BeanProfissionalAssinante>()
		{
			public void onSuccess(BeanProfissionalAssinante result)
			{
				if (result.getNome() != null)
				{
				  nomeTxt.setText(result.getNome());
				}
				if(result.getCpf() != null)
				{
			    	cpfTxt.setText(result.getCpf());
				}

				cpfTxt.setReadOnly(true);

				if (result.getRg() != null)
				{
					rgTxt.setText(result.getRg());		
				}
				if (result.getDataNascimento() != null)
				{
					dataNascimentoTxt.setText(result.getDataNascimento());		
				}
				if(result.getTelefoneResidencial() != null )
				{
					telefoneResidencialTxt.setText(result.getTelefoneResidencial());
				}
				if(result.getCelular() != null)
				{
					celularTxt.setText(result.getCelular());
				}
				if (result.getEmail() != null)
				{
					emailTxt.setText(result.getEmail());
				}
				if(result.getEndereco() != null)
				{
					enderecoTxt.setText(result.getEndereco());
				}
				if(result.getCpf() != null)
				{
				   cepTxt.setText(result.getCep());	
				}
				if(result.getNumero() != null && result.getNumero().intValue() != -1)
				{
					numeroTxt.setText(String.valueOf(result.getNumero()));
				}
				if(result.getBairro() != null)
				{
					bairroTxt.setText(result.getBairro());
				}
				if (result.getComplemento() != null)
				{
					complementoTxt.setText(result.getComplemento());	
				}
				if (result.getCidade() != null)
				{
					cidadeTxt.setText(result.getCidade());
				}
				if(result.getBEstadoCivil() != null && result.getBEstadoCivil().getId() != null) {
				  if(estadoCivilListbox.getCallback()){
					  estadoCivilListbox.setSelectedIndex(result.getBEstadoCivil().getId() == null ? 0: result.getBEstadoCivil().getId());
				  } else {
					  estadoCivilListbox.setIndice(result.getBEstadoCivil().getId());
					  estadoCivilListbox.atauliza();
				  }
					  
				}
				if (result.getBEstado() != null && result.getBEstado().getId() != null)
				{
				   if(estadosListBox.getCallback())
				   {
					   estadosListBox.setSelectedIndex(result.getBEstado().getId() == null ? 0 : result.getBEstado().getId());
				   }
				   else
				   {
					   estadosListBox.setIndice(result.getBEstado().getId());
					   estadosListBox.atualiza();
				   }
				}

				AAlteraDadosProfissional.this.add(flexTable, DockPanel.CENTER);
			}

			public void onFailure(Throwable caught)
			{
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao buscar dados do profissional: " + caught.getMessage());
				errorDialogBox.center();
				errorDialogBox.show();
			}
		};

		Util.getService().getProfissionalById(idProfissional, cbDadosProfissional);

		// botao de alterar...
		atualizarBtn.addClickListener(new ClickListener()
		{
			public void onClick(Widget sender)
			{
				BeanProfissionalAssinante bProfissionalAssinante = new BeanProfissionalAssinante();

				bProfissionalAssinante.setId(idProfissional);
				bProfissionalAssinante.setCpf(cpfTxt.getText());
				bProfissionalAssinante.setRg(rgTxt.getText());
				bProfissionalAssinante.setNome(nomeTxt.getText());
				bProfissionalAssinante.setTelefoneResidencial(telefoneResidencialTxt.getText());
				bProfissionalAssinante.setCelular(celularTxt.getText());
				bProfissionalAssinante.setEmail(emailTxt.getText());
				bProfissionalAssinante.setDataNascimento(dataNascimentoTxt.getText());

				BeanEstadoCivil bEstadoCivil = new BeanEstadoCivil();
				bEstadoCivil.setId(estadoCivilListbox.getValue(estadoCivilListbox.getSelectedIndex()));
				bEstadoCivil.setEstadoCivil(estadoCivilListbox.getItemText(estadoCivilListbox.getSelectedIndex()));

				bProfissionalAssinante.setBEstadoCivil(bEstadoCivil);
				bProfissionalAssinante.setEndereco(enderecoTxt.getText());
				bProfissionalAssinante.setNumero(numeroTxt.getText());
				bProfissionalAssinante.setBairro(bairroTxt.getText());
				bProfissionalAssinante.setComplemento(complementoTxt.getText());
				bProfissionalAssinante.setCidade(cidadeTxt.getText());

				BeanEstado bEstado = new BeanEstado();
				bEstado.setId(estadosListBox.getValue(estadosListBox.getSelectedIndex()));
				bEstado.setEstado(estadosListBox.getItemText(estadosListBox.getSelectedIndex()));

				bProfissionalAssinante.setBEstado(bEstado);
				bProfissionalAssinante.setCep(cepTxt.getText());

				AsyncCallback<Object> callback = new AsyncCallback<Object>()
				{
					public void onSuccess(Object result)
					{
						SuccessDialogBox successDialobBox = new SuccessDialogBox("Dados alterados com sucesso.");
						successDialobBox.center();
						successDialobBox.show();
					};

					public void onFailure(Throwable caught)
					{
						ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao alterar Profissional: " + caught.getMessage());
						errorDialogBox.center();
						errorDialogBox.show();
					};
				};

				if (verificarCampos())
				{
					Util.getService().alterarProfissional(bProfissionalAssinante, callback);
				}
			}
		});
	}

	private void inicializarComponentes()
	{
		flexTable = new FlexTable();

		atualizarBtn = new Button("Atualizar");

		nomeTxt = new TextBox();
		cpfTxt = new CPFBox();
		rgTxt = new NumberBox(120);
		telefoneResidencialTxt = new NumberBox(100);
		celularTxt = new NumberBox(100);
		emailTxt = new EMailBox();
		dataNascimentoTxt = new DateBox();
		estadoCivilListbox = new EstadosCivisListBox();
		enderecoTxt = new TextBox();
		numeroTxt = new NumberBox(50);
		bairroTxt = new TextBox();
		complementoTxt = new TextBox();
		cidadeTxt = new TextBox();
		estadosListBox = new EstadosListBox();
		cepTxt = new CEPBox();

	}

	// define tamanho para cada campo da tela
	private void setarTamanhoCampos()
	{
		nomeTxt.setWidth("300px");
		enderecoTxt.setWidth("250px");
		bairroTxt.setWidth("100px");
		complementoTxt.setWidth("200px");
		cidadeTxt.setWidth("100px");
	}

	// verifica se o preenchimento dos campos estao corretos...
	private boolean verificarCampos()
	{
		if (nomeTxt.getText().equalsIgnoreCase(""))
		{
			InformationDialogBox infoDialogBox = new InformationDialogBox("Preencha o campo 'nome'.");
			infoDialogBox.center();
			infoDialogBox.show();

			return false;
		}

		if (cpfTxt.isVazio())
		{
			InformationDialogBox infoDialogBox = new InformationDialogBox("Preencha o campo CPF.");
			infoDialogBox.center();
			infoDialogBox.show();

			return false;
		}
		
		if (!cpfTxt.isCPFValido())
		{
			InformationDialogBox infoDialogBox = new InformationDialogBox("CPF inválido.");
			infoDialogBox.center();
			infoDialogBox.show();
			
			return false;			
		}
		
		if (!emailTxt.isVazio() && !emailTxt.isEMailValido())
		{
			InformationDialogBox infoDialogBox = new InformationDialogBox("E-Mail inválido.");
			infoDialogBox.center();
			infoDialogBox.show();

			return false;			
		}

		return true;
	}

	// seta o numero maximo de caracteres de cada campo
	private void setarMaxLength()
	{
		nomeTxt.setMaxLength(40);
		cpfTxt.setMaxLength(16);
		rgTxt.setMaxLength(10);
		telefoneResidencialTxt.setMaxLength(14); // (ddd) 9999 9999
		celularTxt.setMaxLength(14); // (ddd) 9999 9999
		enderecoTxt.setMaxLength(40);
		numeroTxt.setMaxLength(11);
		bairroTxt.setMaxLength(12);
		complementoTxt.setMaxLength(100);
		cidadeTxt.setMaxLength(40);
	}

	private void setarAlinhamento()
	{
		FlexCellFormatter cellFormatter = flexTable.getFlexCellFormatter();

		for (int x = 1; x <= 15; x++)
		{
			cellFormatter.setAlignment(x, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		}
	}
}